package com.eternal.peaceworld.service;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.nio.charset.StandardCharsets;
import java.util.Base64;

/**
 * 加密解密抽象基类，提供通用工具方法
 */
public abstract class AbstractEncryptorService implements EncryptorService {

    protected final Logger logger = LoggerFactory.getLogger(getClass());

    protected static final String CHARSET = "UTF-8";

    /**
     * 字符串转字节数组（UTF-8）
     */
    protected byte[] toBytes(String str) {
        return str.getBytes(StandardCharsets.UTF_8);
    }

    /**
     * 字节数组转字符串（UTF-8）
     */
    protected String toString(byte[] bytes) {
        return new String(bytes, StandardCharsets.UTF_8);
    }

    /**
     * Base64 编码
     */
    protected String base64Encode(byte[] data) {
        return Base64.getEncoder().encodeToString(data);
    }

    /**
     * Base64 解码
     */
    protected byte[] base64Decode(String encoded) {
        return Base64.getDecoder().decode(encoded);
    }

    /**
     * 空值校验
     */
    protected void validate(String text, String type) {
        if (text == null || text.trim().isEmpty()) {
            throw new IllegalArgumentException(type + " 不能为空");
        }
    }
    /**
     * 执行加密
     */

    @Override
    public final String encrypt(String plainText) {
        validate(plainText, "明文");
        try {
            logger.debug("开始加密...");
            String result = doEncrypt(plainText);
            logger.debug("加密成功");
            return result;
        } catch (Exception e) {
            logger.error("加密失败: {}", plainText, e);
            throw new RuntimeException("加密失败", e);
        }
    }

    /**
     * 执行解密
     */
    @Override
    public final String decrypt(String encryptedText) {
        validate(encryptedText, "密文");
        try {
            logger.debug("开始解密...");
            String result = doDecrypt(encryptedText);
            logger.debug("解密成功");
            return result;
        } catch (Exception e) {
            logger.error("解密失败: {}", encryptedText, e);
            throw new RuntimeException("解密失败", e);
        }
    }

    /**
     * 子类实现具体加密逻辑
     */
    protected abstract String doEncrypt(String plainText);

    /**
     * 子类实现具体解密逻辑
     */
    protected abstract String doDecrypt(String encryptedText);
}